package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import builder.ProductoDirector;

import controller.EstadoController;

import model.*;

public class JuegoDao extends BaseDao{
	private ResultSet juegoResult;
	private static JuegoDao juegoDao=null;
	private ProductoDirector prodDir=new ProductoDirector();
	private List<Juego> juegos;

	private JuegoDao(){}
	public static JuegoDao getJuegoDao(){
		if (juegoDao == null) {
			juegoDao = new JuegoDao();
			}
			return juegoDao;
	}
	@Override
	public List<Juego> listar(){
		ArrayList<Juego> list=new ArrayList<Juego>();
		try {
			String sqlSent="SELECT * FROM `juego` ORDER BY nombre";
			juegoResult=consultar(sqlSent);
			while(juegoResult.next()){
				Juego juego=prodDir.crearJuego(
						juegoResult.getInt("id"),
						juegoResult.getString("nombre"),
						juegoResult.getString("fechaEstreno"),
						juegoResult.getInt("categoria_id"),
						juegoResult.getInt("alquilerTipo_id"),
						juegoResult.getInt("plataforma_id")
					);
				list.add(juego);
			}
			desconectar();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		juegos=list;
		return juegos;
	}

	public List<JuegoCopia> listarCopias(Juego juego){
		ArrayList<JuegoCopia>copias=new ArrayList<JuegoCopia>();
		try {
			String sqlSent="SELECT * FROM `juegoCopia` WHERE juego_id="+juego.getId();
			juegoResult=consultar(sqlSent);
			while (juegoResult.next()) {
				JuegoCopia juegoCopia=new JuegoCopia(
						juegoResult.getInt("id"),
						juego,
						juegoResult.getString("fechaAdquisicion"),
						EstadoController.definirEstado(juegoResult.getInt("estado_id"))
					);
				copias.add(juegoCopia);
			}
			return copias;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			copias=null;
			return copias;
		}
	}

	@Override
	public Juego buscar(Integer id){
		try {
			String sqlSent="SELECT * FROM `juego` WHERE id="+id;
			juegoResult=consultar(sqlSent);
			if(juegoResult.next()){
				Juego juego=prodDir.crearJuego(
						juegoResult.getInt("id"),
						juegoResult.getString("nombre"),
						juegoResult.getString("fechaEstreno"),
						juegoResult.getInt("categoria_id"),
						juegoResult.getInt("alquilerTipo_id"),
						juegoResult.getInt("plataforma_id")
					);
				return juego;
			}else{
				Juego juego=null;
				return juego;
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Juego juego=null;
			return juego;
		}
	}

	public List<Juego> buscador(String v_text,String categoria,String plataforma,String tipoAlq) throws SQLException, Exception{
		String sentenciaSQL;
		String baseSQL="SELECT j.*" +
				" FROM juego j JOIN categoria c ON (j.categoria_id=c.id)" +
				" JOIN alquilerTipo aT ON (j.alquilerTipo_id=aT.id)" +
				" JOIN plataforma p ON (j.plataforma_id=p.id)" +
				" WHERE j.nombre like '%"+v_text+"%'";
		String catDB=" c.nombre='"+categoria+"'";
		String platDB=" p.nombre='"+plataforma+"'";
		String tAlqDB=" aT.nombre='"+tipoAlq+"'";
		juegos = new ArrayList<Juego>();
		if(categoria.equals("Todas")){
			catDB="";
			if(plataforma.equals("Todas")){
				platDB="";
				if(tipoAlq.equals("Todos")){
					sentenciaSQL = baseSQL+" ORDER BY j.id ASC";
				}else{
					sentenciaSQL = baseSQL+" AND"+tAlqDB+" ORDER BY j.id ASC";
				}
			}else{
				if(tipoAlq.equals("Todos")){
					sentenciaSQL = baseSQL+" AND"+platDB+" ORDER BY j.id ASC";
				}else{
					sentenciaSQL = baseSQL+" AND"+tAlqDB+" AND"+platDB+" ORDER BY j.id ASC";
				}
			}
		}else{
			if(plataforma.equals("Todas")){
				platDB="";
				if(tipoAlq.equals("Todos")){
					sentenciaSQL = baseSQL+" AND"+catDB+" ORDER BY j.id ASC";
				}else{
					sentenciaSQL = baseSQL+" AND"+tAlqDB+" AND"+catDB+" ORDER BY j.id ASC";
				}
			}else{
				if(tipoAlq.equals("Todos")){
					sentenciaSQL = baseSQL+" AND"+catDB+" AND"+platDB+" ORDER BY j.id ASC";
				}else{
					sentenciaSQL = baseSQL+" AND"+tAlqDB+" AND"+platDB+" AND"+catDB+" ORDER BY j.id ASC";
				}
			}
		}
		System.out.println(sentenciaSQL);
		juegoResult = consultar(sentenciaSQL);
		while (juegoResult.next()) {
			Juego juego=prodDir.crearJuego(
					juegoResult.getInt("id"),
					juegoResult.getString("nombre"),
					juegoResult.getString("fechaEstreno"),
					juegoResult.getInt("categoria_id"),
					juegoResult.getInt("alquilerTipo_id"),
					juegoResult.getInt("plataforma_id")
				);
			juegos.add(juego);
			if (juegos.isEmpty()) System.out.println("esta vacia");
		}
		return juegos;
	}

	@Override
	public void guardar(Object juego)throws SQLException {
		Integer resultado=null;
		String sqlSent="INSERT INTO `juego` (nombre,fechaEstreno,categoria_id,alquilerTipo_id,plataforma_id) VALUES " +
						"(\""+((Juego) juego).getNombre()+"\"," +
						"'"+((Juego) juego).getFechaEstreno()+"',"+
						((Juego) juego).getCategoria().getId()+","+
						((Juego) juego).getAlquilerTipo().getId()+","+
						((Juego) juego).getPlataforma().getId()+
					");";
		try {
			System.out.println(sqlSent);
			modificar(sqlSent);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("Resultado: "+resultado);
			e.printStackTrace();
			throw new SQLException("Error al guardar el juego");
		}
	}

	public void guardarCopia(Object juegoCopia)throws SQLException {
		Integer resultado=null;
		String sqlSent="INSERT INTO `juegoCopia` (fechaAdquisicion,estado_id,juego_id) VALUES " +
						"('"+((JuegoCopia) juegoCopia).getFechaAdquisicion()+"',1,"+((JuegoCopia) juegoCopia).getJuego().getId()+");";
		try {
			System.out.println(sqlSent);
			modificar(sqlSent);
		} catch (Exception e) {
			System.out.println("Resultado: "+resultado);
			e.printStackTrace();
			throw new SQLException("Error al guardar la copia del juego");
		}
	}

	@Override
	public void eliminar(Integer id)throws SQLException {
		Integer resultado=null;
		String sqlSent="DELETE FROM `juego` WHERE id="+id;
		try {
			modificar(sqlSent);
		} catch (Exception e) {
			System.out.println("Resultado: "+resultado);
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SQLException("Error al borrar el juego");
		}
	}
	public void eliminarCopia(Integer id)throws SQLException {
		Integer resultado=null;
		String sqlSent="DELETE FROM `juegoCopia` WHERE id="+id;
		try {
			modificar(sqlSent);
		} catch (Exception e) {
			System.out.println("Resultado: "+resultado);
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SQLException("Error al borrar la copia del juego");
		}
	}

	@Override
	public void modificar(Object juego)throws SQLException {
		Integer resultado=null;
		String sqlSent="UPDATE `juego` SET nombre='"+((Juego) juego).getNombre()+"' WHERE id="+((Juego) juego).getId();
		try {
			modificar(sqlSent);
		} catch (Exception e) {
			System.out.println("Resultado: "+resultado);
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new SQLException("Error al modificar el juego");
		}
	}

	public Integer getInventario(){
		Integer resultado=null;
		String sqlSent="SELECT inventarioBase FROM numInventarioBase WHERE producto='juego'";
		try {
			juegoResult=consultar(sqlSent);
			if(juegoResult.next()){
				resultado=juegoResult.getInt("inventarioBase");
			}
			return resultado;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return resultado;
		}
	}
}
